package services.movimiento;

import java.util.ArrayList;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import util.assembly.MovimientoCajaAssembly;
import bo.MovimientoCaja;
import bo.PersistentObject;
import dao.MovimientoCajaDAO;
import dto.MovimientoCajaDTO;
import dto.SearchDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;

public class MovimientoCajaService {
	
	MovimientoCajaDAO movimientoCajaDAO;
	
	/**
	 * Guarda un movimientoCaja
	 * @param movimientoCajaDTO	DTO de movimientoCaja
	 */
	@Transactional
	public String save(MovimientoCajaDTO movimientoCajaDTO) throws CannotSaveException {
		
		MovimientoCaja movimientoCaja = MovimientoCajaAssembly.toBO(movimientoCajaDTO);
		
		String id = movimientoCajaDAO.save(movimientoCaja);
		if (id == null) {
			throw new CannotSaveException();
		}
		return id;
	}

	@Transactional
	public List<MovimientoCajaDTO> findAll(String order, boolean asc) {
		
		List<MovimientoCajaDTO> lista = new ArrayList<MovimientoCajaDTO>();
		
		List<PersistentObject> movimientos = movimientoCajaDAO.findAll(MovimientoCaja.class, order, asc);
		for (PersistentObject persistentObject : movimientos) {
			lista.add(MovimientoCajaAssembly.toDTO((MovimientoCaja)persistentObject));
		}
		return lista;
	}
	
	/**
	 * Borra un movimientoCaja
	 * @param id	ID del movimientoCaja a borrar
	 * @throws CannotDeleteException
	 */
	@Transactional
	public void delete(String id) throws CannotDeleteException {
		
		MovimientoCaja movimientoCaja = movimientoCajaDAO.findById(id);
		
		movimientoCajaDAO.delete(movimientoCaja);
	}
	
	
	@Transactional
	public List<MovimientoCajaDTO> search(SearchDTO searchDTO) {
		
		List<MovimientoCajaDTO> lista = new ArrayList<MovimientoCajaDTO>();
		
		List<PersistentObject> movimientoCajas = movimientoCajaDAO.search(MovimientoCaja.class, searchDTO);
		for (PersistentObject persistentObject : movimientoCajas) {
			lista.add(MovimientoCajaAssembly.toDTO((MovimientoCaja)persistentObject));
		}
		return lista;
	}
	
	
	
	/**
	 * Obtiene todos los producots
	 * @return	la lista de movimientoCajas
	 */
	@Transactional
	public List<MovimientoCajaDTO> findAll() {
		
		List<MovimientoCajaDTO> lista = new ArrayList<MovimientoCajaDTO>();
		
		List<PersistentObject> movimientoCajas = movimientoCajaDAO.findAll();
		for (PersistentObject persistentObject : movimientoCajas) {
			lista.add(MovimientoCajaAssembly.toDTO((MovimientoCaja)persistentObject));
		}
		return lista;
	}
	
	/**
	 * Obtiene un movimientoCaja segun ID
	 * @param id	el ID
	 * @return el movimientoCaja
	 */
	@Transactional
	public MovimientoCajaDTO findById(String id) {
		
		MovimientoCaja movimientoCaja = movimientoCajaDAO.findById(id);
		MovimientoCajaDTO movimientoCajaDTO = MovimientoCajaAssembly.toDTO(movimientoCaja);
		return movimientoCajaDTO;
	}
	

	public MovimientoCajaDAO getMovimientoCajaDAO() {
		return movimientoCajaDAO;
	}

	public void setMovimientoCajaDAO(MovimientoCajaDAO movimientoCajaDAO) {
		this.movimientoCajaDAO = movimientoCajaDAO;
	}
	
}
